#include <iostream>
#include <set>
using namespace std;

void Test01() {
    set<int> s;
    s.insert(10);
    s.insert(10);
    s.insert(5);
    s.insert(15);
    s.insert(20);
    s.insert(25);
    s.insert(25);

    for (set<int>::iterator it = s.begin(); it != s.end(); ++it) {
        cout << *it << "\n";
    }
}

void Test02() {
    set<int> s;
    s.insert(10);
    s.insert(10);
    s.insert(5);
    s.insert(15);
    s.insert(20);
    s.insert(25);
    s.insert(25);

    cout << "元素在集合中:\n";
    set<int>::iterator lowerIt = s.lower_bound(15);
    cout << *lowerIt << "\n";

    set<int>::iterator upperIt = s.upper_bound(15);
    cout << *upperIt << "\n";

    cout << "元素不在集合中:\n";
    set<int>::iterator lowerIt2 = s.lower_bound(12);

    cout << *lowerIt2 << "\n";
    cout << *(--lowerIt2) << "\n";
    set<int>::iterator upperIt2 = s.upper_bound(12);
    cout << *upperIt2 << "\n";

    cout << "使用lower_bound遍历:\n";
    for (set<int>::iterator lowerIt3 = s.lower_bound(12);
         lowerIt3 != s.end(); ++lowerIt3) {
        cout << *lowerIt3 << "\n";
    }
}


/**
 * lower_bound
 * 出错的情况1
 * 
 * 为什么要测试右边界，因为*it会胡乱打印
 */
void Test03(){
    set<int> s;
    s.insert(3);
    s.insert(5);
    s.insert(7);
    s.insert(10);

    cout << "==========超出右边界================\n";
    set<int>::iterator it = s.lower_bound(15);
    //胡乱打印
    cout << *it << "\n";
    //打印true（1）
    cout << (it == s.end()) << "\n";

    //获取最后一个元素
    it = prev(it);
    cout << *it << "\n";

    cout << "==========正好是右边界================\n";
    it = s.lower_bound(10);
    cout << *it << "\n";
    cout << (it == s.end()) << "\n";
}

/**
 * lower_bound
 * 出错情况2
 * 
 * 为什么要测试左边界，因为prev(it)会胡乱打印
 */
void Test04(){
    set<int> s;
    s.insert(3);
    s.insert(5);
    s.insert(7);
    s.insert(10);

    set<int>::iterator it = s.lower_bound(2);

    //打印最小值
    cout << *it << "\n";

    //打印最小值
    it = s.lower_bound(3);
    cout << *it << "\n";

    //打印true（1）
    cout << (it == s.begin()) << "\n";

    //胡乱打印
    it = prev(it);
    cout << *it << "\n"; 

}


/**
 * lower_bound
 * 测试
 */
void Test05() {
    set<int> s;
    s.insert(3);
    s.insert(5);
    s.insert(7);
    s.insert(10);

    //正好有这个元素，直接返回这个元素
    cout << "==========正好有这个元素================\n";
    set<int>::iterator it = s.lower_bound(5);
    cout << *it << "\n"; // 输出 5

    //没有这个元素，返回大于等于这个元素的第一个元素
    cout << "==========没有这个元素，返回大于等于这个元素的第一个元素================\n";
    it = s.lower_bound(8);
    cout << *it << "\n"; // 输出 10
    cout << "==========使用prev(it)获取前一个元素================\n";
    set<int>::iterator itPrev = prev(it);
    cout << *itPrev << "\n"; // 输出 7
}

/**
 * 集合的上界下界
 *
 * @return
 */
int main() {
    // Test02();

    // Test03();

    Test04();

    // Test05();

    return 0;
}